      1  /**

      2     This class describes words in a document. There are a couple

      3     of bugs in this class.

      4  */

      5  public class Word

      6  {

      7     private String text;

      8

      9     /**

     10        Constructs a word by removing leading and trailing non-

     11        letter characters, such as punctuation marks.

     12        @param s the input string

     13     */

     14     public Word(String s)

     15     {

     16        int i = 0;

     17        while (i < s.length() && !Character.isLetter(s.charAt(i)))

     18        {

     19           i++;

     20        }

     21        int j = s.length() - 1;

     22        while (j > i && !Character.isLetter(s.charAt(j)))

     23        {

     24           j--;

     25        }

     26        text = s.substring(i, j);

     27     }

     28

     29     /**

     30        Returns the text of the word, after removal of the

     31        leading and trailing non-letter characters.

     32        @return the text of the word

     33     */

     34     public String getText()

     35     {

     36        return text;

     37     }

     38

     39     /**

     40        Counts the syllables in the word.

     41        @return the syllable count

     42     */

     43     public int countSyllables()

     44     {

     45        int count = 0;

     46        int end = text.length() - 1;

     47        if (end < 0) { return 0; } // The empty string has no syllables

     48

     49        // An e at the end of the word doesn't count as a vowel

     50        char ch = text.charAt(end);

     51        if (ch == 'e' || ch == 'E') { end--; }

     52

     53        boolean insideVowelGroup = false;

     54        for (int i = 0; i <= end; i++)

     55        {

     56           ch = text.charAt(i);

     57           String vowels = "aeiouyAEIOUY";

     58           if (vowels.indexOf(ch) >= 0)

     59           {

     60              // ch is a vowel

     61              if (!insideVowelGroup)

     62              {

     63                 // Start of new vowel group

     64                 count++;

     65                 insideVowelGroup = true;

     66              }

     67           }

     68        }

     69

     70        // Every word has at least one syllable

     71        if (count == 0) { count = 1; }

     72

     73        return count;

     74     }

     75  }